diff options
| author | Ondřej Surý <ondrej@sury.org> | 2011-02-14 13:23:51 +0100 | 
|---|---|---|
| committer | Ondřej Surý <ondrej@sury.org> | 2011-02-14 13:23:51 +0100 | 
| commit | 758ff64c69e34965f8af5b2d6ffd65e8d7ab2150 (patch) | |
| tree | 6d6b34f8c678862fe9b56c945a7b63f68502c245 /doc/go_spec.html | |
| parent | 3e45412327a2654a77944249962b3652e6142299 (diff) | |
| download | golang-upstream/2011-02-01.1.tar.gz | |
Imported Upstream version 2011-02-01.1upstream/2011-02-01.1
Diffstat (limited to 'doc/go_spec.html')
| -rw-r--r-- | doc/go_spec.html | 329 | 
1 files changed, 165 insertions, 164 deletions
| diff --git a/doc/go_spec.html b/doc/go_spec.html index e1c7e90e2..4e5d9c639 100644 --- a/doc/go_spec.html +++ b/doc/go_spec.html @@ -1,5 +1,5 @@  <!-- title The Go Programming Language Specification --> -<!-- subtitle Version of January 7, 2011 --> +<!-- subtitle Version of February 1, 2011 -->  <!--  TODO @@ -11,7 +11,7 @@ TODO      (struct{T} vs struct {T T} vs struct {t T})  [ ] need explicit language about the result type of operations  [ ] may want to have some examples for the types of shift operations -[ ] should string(1<<s) and float(1<<s) be valid? +[ ] should string(1<<s) and float32(1<<s) be valid?  [ ] should probably write something about evaluation order of statements even  	though obvious  [ ] review language on implicit dereferencing @@ -531,7 +531,7 @@ the result value of some built-in functions such as  <code>cap</code> or <code>len</code> applied to  <a href="#Length_and_capacity">some expressions</a>,  <code>real</code> and <code>imag</code> applied to a complex constant -and <code>cmplx</code> applied to numeric constants. +and <code>complex</code> applied to numeric constants.  The boolean truth values are represented by the predeclared constants  <code>true</code> and <code>false</code>. The predeclared identifier  <a href="#Iota">iota</a> denotes an integer constant. @@ -561,7 +561,7 @@ or <a href="#Conversions">conversion</a>, or implicitly when used in a  <a href="#Assignments">assignment</a> or as an  operand in an <a href="#Expressions">expression</a>.  It is an error if the constant value -cannot be accurately represented as a value of the respective type. +cannot be represented as a value of the respective type.  For instance, <code>3.0</code> can be given any integer or any  floating-point type, while <code>2147483648.0</code> (equal to <code>1<<31</code>)  can be given the types <code>float32</code>, <code>float64</code>, or <code>uint32</code> but @@ -699,9 +699,7 @@ There is also a set of predeclared numeric types with implementation-specific si  <pre class="grammar">  uint     either 32 or 64 bits -int      either 32 or 64 bits -float    either 32 or 64 bits -complex  real and imaginary parts have type float +int      same size as uint  uintptr  an unsigned integer large enough to store the uninterpreted bits of a pointer value  </pre> @@ -871,8 +869,8 @@ struct {}  // A struct with 6 fields.  struct {  	x, y int -	u float -	_ float  // padding +	u float32 +	_ float32  // padding  	A *[]int  	F func()  } @@ -1007,10 +1005,10 @@ func()  func(x int)  func() int  func(prefix string, values ...int) -func(a, b int, z float) bool -func(a, b int, z float) (bool) -func(a, b int, z float, opt ...interface{}) (success bool) -func(int, int, float) (float, *[]int) +func(a, b int, z float32) bool +func(a, b int, z float32) (bool) +func(a, b int, z float64, opt ...interface{}) (success bool) +func(int, int, float64) (float64, *[]int)  func(n int) func(p *T)  </pre> @@ -1146,7 +1144,7 @@ failure will cause a <a href="#Run_time_panics">run-time panic</a>.  <pre>  map [string] int -map [*T] struct { x, y float } +map [*T] struct { x, y float64 }  map [string] interface {}  </pre> @@ -1197,7 +1195,7 @@ A channel may be constrained only to send or only to receive by  <pre>  chan T         // can be used to send and receive values of type T -chan<- float   // can only be used to send floats +chan<- float64 // can only be used to send float64s  <-chan int     // can only be used to receive ints  </pre> @@ -1291,8 +1289,8 @@ type (  	T1 []string  	T2 struct { a, b int }  	T3 struct { a, c int } -	T4 func(int, float) *T0 -	T5 func(x int, y float) *[]string +	T4 func(int, float64) *T0 +	T5 func(x int, y float64) *[]string  )  </pre> @@ -1304,13 +1302,13 @@ these types are identical:  T0 and T0  []int and []int  struct { a, b *T5 } and struct { a, b *T5 } -func(x int, y float) *[]string and func(int, float) (result *[]string) +func(x int, y float64) *[]string and func(int, float64) (result *[]string)  </pre>  <p>  <code>T0</code> and <code>T1</code> are different because they are named types -with distinct declarations; <code>func(int, float) *T0</code> and -<code>func(x int, y float) *[]string</code> are different because <code>T0</code> +with distinct declarations; <code>func(int, float64) *T0</code> and +<code>func(x int, y float64) *[]string</code> are different because <code>T0</code>  is different from <code>[]string</code>.  </p> @@ -1483,7 +1481,7 @@ Basic types:  	int8 int16 int32 int64 string uint8 uint16 uint32 uint64  Architecture-specific convenience types: -	complex float int uint uintptr +	int uint uintptr  Constants:  	true false iota @@ -1492,7 +1490,7 @@ Zero value:  	nil  Functions: -	append cap close closed cmplx copy imag len +	append cap close closed complex copy imag len  	make new panic print println real recover  </pre> @@ -1561,7 +1559,7 @@ const (  	eof = -1             // untyped integer constant  )  const a, b, c = 3, 4, "foo"  // a = 3, b = 4, c = "foo", untyped integer and string constants -const u, v float = 0, 3      // u = 0.0, v = 3.0 +const u, v float32 = 0, 3    // u = 0.0, v = 3.0  </pre>  <p> @@ -1614,9 +1612,9 @@ const (  )  const ( -	u       = iota * 42  // u == 0     (untyped integer constant) -	v float = iota * 42  // v == 42.0  (float constant) -	w       = iota * 42  // w == 84    (untyped integer constant) +	u         = iota * 42  // u == 0     (untyped integer constant) +	v float64 = iota * 42  // v == 42.0  (float64 constant) +	w         = iota * 42  // w == 84    (untyped integer constant)  )  const x = iota  // x == 0 (iota has been reset) @@ -1736,9 +1734,9 @@ VarSpec     = IdentifierList ( Type [ "=" ExpressionList ] | "=" ExpressionList  <pre>  var i int -var U, V, W float +var U, V, W float64  var k = 0 -var x, y float = -1, -2 +var x, y float32 = -1, -2  var (  	i int  	u, v, s = 2.0, 3.0, "bar" @@ -1763,7 +1761,7 @@ of the expression list.  <p>  If the type is absent and the corresponding expression evaluates to an  untyped <a href="#Constants">constant</a>, the type of the declared variable -is <code>bool</code>, <code>int</code>, <code>float</code>, or <code>string</code> +is <code>bool</code>, <code>int</code>, <code>float64</code>, or <code>string</code>  respectively, depending on whether the value is a boolean, integer,  floating-point, or string constant:  </p> @@ -1771,7 +1769,7 @@ floating-point, or string constant:  <pre>  var b = true    // t has type bool  var i = 0       // i has type int -var f = 3.0     // f has type float +var f = 3.0     // f has type float64  var s = "OMDB"  // s has type string  </pre> @@ -2055,7 +2053,7 @@ For array and slice literals the following rules apply:  <p>  Taking the address of a composite literal (§<a href="#Address_operators">Address operators</a>) -generates a unique pointer to an instance of the literal's value. +generates a pointer to a unique instance of the literal's value.  </p>  <pre>  var pointer *Point3D = &Point3D{y: 1000} @@ -2132,11 +2130,11 @@ primes := []int{2, 3, 5, 7, 9, 11, 13, 17, 19, 991}  // vowels[ch] is true if ch is a vowel  vowels := [128]bool{'a': true, 'e': true, 'i': true, 'o': true, 'u': true, 'y': true} -// the array [10]float{-1, 0, 0, 0, -0.1, -0.1, 0, 0, 0, -1} -filter := [10]float{-1, 4: -0.1, -0.1, 9: -1} +// the array [10]float32{-1, 0, 0, 0, -0.1, -0.1, 0, 0, 0, -1} +filter := [10]float32{-1, 4: -0.1, -0.1, 9: -1}  // frequencies in Hz for equal-tempered scale (A4 = 440Hz) -noteFrequency := map[string]float{ +noteFrequency := map[string]float32{  	"C0": 16.35, "D0": 18.35, "E0": 20.60, "F0": 21.83,  	"G0": 24.50, "A0": 27.50, "B0": 30.87,  } @@ -2155,7 +2153,7 @@ FunctionLit = FunctionType Body .  </pre>  <pre> -func(a, b int, z float) bool { return a*b < int(z) } +func(a, b int, z float64) bool { return a*b < int(z) }  </pre>  <p> @@ -2590,7 +2588,7 @@ func Join(s, t string) string {  }  if Join(Split(value, len(value)/2)) != value { -	log.Crash("test fails") +	log.Panic("test fails")  }  </pre> @@ -2669,9 +2667,7 @@ Operators combine operands into expressions.  Expression = UnaryExpr | Expression binary_op UnaryExpr .  UnaryExpr  = PrimaryExpr | unary_op UnaryExpr . -binary_op  = log_op | com_op | rel_op | add_op | mul_op . -log_op     = "||" | "&&" . -com_op     = "<-" . +binary_op  = "||" | "&&" | rel_op | add_op | mul_op .  rel_op     = "==" | "!=" | "<" | "<=" | ">" | ">=" .  add_op     = "+" | "-" | "|" | "^" .  mul_op     = "*" | "/" | "%" | "<<" | ">>" | "&" | "&^" . @@ -2713,11 +2709,11 @@ the left operand alone.  <pre>  var s uint = 33 -var i = 1<<s          // 1 has type int -var j = int32(1<<s)   // 1 has type int32; j == 0 -var u = uint64(1<<s)  // 1 has type uint64; u == 1<<33 -var f = float(1<<s)   // illegal: 1 has type float, cannot shift -var g = float(1<<33)  // legal; 1<<33 is a constant shift operation; g == 1<<33 +var i = 1<<s            // 1 has type int +var j = int32(1<<s)     // 1 has type int32; j == 0 +var u = uint64(1<<s)    // 1 has type uint64; u == 1<<33 +var f = float32(1<<s)   // illegal: 1 has type float32, cannot shift +var g = float32(1<<33)  // legal; 1<<33 is a constant shift operation; g == 1<<33  </pre>  <h3 id="Operator_precedence">Operator precedence</h3> @@ -2728,18 +2724,17 @@ statements, not expressions, they fall  outside the operator hierarchy.  As a consequence, statement <code>*p++</code> is the same as <code>(*p)++</code>.  <p> -There are six precedence levels for binary operators. +There are five precedence levels for binary operators.  Multiplication operators bind strongest, followed by addition -operators, comparison operators, <code><-</code> (channel send), -<code>&&</code> (logical and), and finally <code>||</code> (logical or): +operators, comparison operators, <code>&&</code> (logical and), +and finally <code>||</code> (logical or):  </p>  <pre class="grammar">  Precedence    Operator -    6             *  /  %  <<  >>  &  &^ -    5             +  -  |  ^ -    4             ==  !=  <  <=  >  >= -    3             <- +    5             *  /  %  <<  >>  &  &^ +    4             +  -  |  ^ +    3             ==  !=  <  <=  >  >=      2             &&      1             ||  </pre> @@ -2985,15 +2980,19 @@ The right operand is evaluated conditionally.  <h3 id="Address_operators">Address operators</h3>  <p> -The address-of operator <code>&</code> generates the address of its operand, -which must be <i>addressable</i>, +For an operand <code>x</code> of type <code>T</code>, the address operation +<code>&x</code> generates a pointer of type <code>*T</code> to <code>x</code>. +The operand must be <i>addressable</i>,  that is, either a variable, pointer indirection, or slice indexing -operation; -or a field selector of an addressable struct operand; +operation; or a field selector of an addressable struct operand;  or an array indexing operation of an addressable array. -Given an operand of pointer type, the pointer indirection -operator <code>*</code> retrieves the value pointed -to by the operand. +As an exception to the addressability requirement, <code>x</code> may also be a +<a href="#Composite_literals">composite literal</a>. +</p> +<p> +For an operand <code>x</code> of pointer type <code>*T</code>, the pointer +indirection <code>*x</code> denotes the value of type <code>T</code> pointed +to by <code>x</code>.  </p>  <pre> @@ -3003,76 +3002,28 @@ to by the operand.  *pf(x)  </pre> -<h3 id="Communication_operators">Communication operators</h3> - -<p> -The term <i>channel</i> means "value of <a href="#Channel_types">channel type</a>". -</p> -<p> -The send operation uses the binary operator "<-", which operates on -a channel and a value (expression): -</p> - -<pre> -ch <- 3 -</pre> - -<p> -The send operation sends the value on the channel.  Both the channel -and the expression are evaluated before communication begins. -Communication blocks until the send can proceed, at which point the -value is transmitted on the channel. -A send on an unbuffered channel can proceed if a receiver is ready. -A send on a buffered channel can proceed if there is room in the buffer. -</p> -<p> -If the send operation appears in an expression context, the value -of the expression is a boolean and the operation is non-blocking. -The value of the boolean reports true if the communication succeeded, -false if it did not. (The channel and -the expression to be sent are evaluated regardless.) -These two examples are equivalent: -</p> - -<pre> -ok := ch <- 3 -if ok { print("sent") } else { print("not sent") } - -if ch <- 3 { print("sent") } else { print("not sent") } -</pre> - -<p> -In other words, if the program tests the value of a send operation, -the send is non-blocking and the value of the expression is the -success of the operation.  If the program does not test the value, -the operation blocks until it succeeds. -</p> -<p> -The receive operation uses the prefix unary operator "<-". -The value of the expression is the value received, whose type -is the element type of the channel. -</p> -<pre> -<-ch -</pre> +<h3 id="Receive_operator">Receive operator</h3>  <p> -The expression blocks until a value is available, which then can -be assigned to a variable or used like any other expression. -If the receive expression does not save the value, the value is -discarded. +For an operand <code>ch</code> of <a href="#Channel_types">channel type</a>, +the value of the receive operation <code><-ch</code> is the value received +from the channel <code>ch</code>. The type of the value is the element type of +the channel. The expression blocks until a value is available.  </p>  <pre>  v1 := <-ch  v2 = <-ch  f(<-ch) -<-strobe  // wait until clock pulse +<-strobe  // wait until clock pulse and discard received value  </pre> +<!-- +    TODO(rsc): Add after a release or two without any x,ok := <-c. +  <p> -If a receive expression is used in an assignment or initialization of the form +A receive expression used in an assignment or initialization of the form  </p>  <pre> @@ -3082,18 +3033,16 @@ var x, ok = <-ch  </pre>  <p> -the receive operation becomes non-blocking. -If the operation can proceed, the boolean variable -<code>ok</code> will be set to <code>true</code> -and the value stored in <code>x</code>; otherwise -<code>ok</code> is set -to <code>false</code> and <code>x</code> is set to the -zero value for its type (§<a href="#The_zero_value">The zero value</a>). +yields an additional result. +The boolean variable <code>ok</code> indicates whether +the received value was sent on the channel (<code>true</code>) +or is a <a href="#The_zero_value">zero value</a> returned +because the channel is closed and empty (<code>false</code>).  </p> +-->  <p> -Except in a communications clause of a <a href="#Select_statements">select statement</a>, -sending or receiving from a <code>nil</code> channel causes a +Receiving from a <code>nil</code> channel causes a  <a href="#Run_time_panics">run-time panic</a>.  </p> @@ -3104,6 +3053,7 @@ need to be presented regarding send, receive, select, and goroutines.</span>  </p>  ---> +  <h3 id="Method_expressions">Method expressions</h3>  <p> @@ -3128,8 +3078,8 @@ Consider a struct type <code>T</code> with two methods,  type T struct {  	a int  } -func (tv  T) Mv(a int)   int   { return 0 }  // value receiver -func (tp *T) Mp(f float) float { return 1 }  // pointer receiver +func (tv  T) Mv(a int)     int     { return 0 }  // value receiver +func (tp *T) Mp(f float32) float32 { return 1 }  // pointer receiver  var t T  </pre> @@ -3174,7 +3124,7 @@ yields a function value representing <code>Mp</code> with signature  </p>  <pre> -func(tp *T, f float) float +func(tp *T, f float32) float32  </pre>  <p> @@ -3422,14 +3372,14 @@ result is an untyped complex constant.  Complex constants are always constructed from  constant expressions involving imaginary  literals or constants derived from them, or calls of the built-in function -<a href="#Complex_numbers"><code>cmplx</code></a>. +<a href="#Complex_numbers"><code>complex</code></a>.  </p>  <pre>  const Σ = 1 - 0.707i  const Δ = Σ + 2.0e-4 - 1/1i  const Φ = iota * 1i -const iΓ = cmplx(0, Γ) +const iΓ = complex(0, Γ)  </pre>  <p> @@ -3525,7 +3475,7 @@ Statement =  	FallthroughStmt | Block | IfStmt | SwitchStmt | SelectStmt | ForStmt |  	DeferStmt . -SimpleStmt = EmptyStmt | ExpressionStmt | IncDecStmt | Assignment | ShortVarDecl . +SimpleStmt = EmptyStmt | ExpressionStmt | SendStmt | IncDecStmt | Assignment | ShortVarDecl .  </pre> @@ -3553,14 +3503,14 @@ Label       = identifier .  </pre>  <pre> -Error: log.Crash("error encountered") +Error: log.Panic("error encountered")  </pre>  <h3 id="Expression_statements">Expression statements</h3>  <p> -Function calls, method calls, and channel operations +Function calls, method calls, and receive operations  can appear in statement context.  </p> @@ -3570,11 +3520,44 @@ ExpressionStmt = Expression .  </pre>  <pre> -f(x+y) +h(x+y) +f.Close()  <-ch  </pre> +<h3 id="Send_statements">Send statements</h3> + +<p> +A send statement sends a value on a channel. +The channel expression must be of <a href="#Channel_types">channel type</a> +and the type of the value must be <a href="#Assignability">assignable</a> +to the channel's element type. +</p> + +<pre class="ebnf"> +SendStmt = Channel "<-" Expression . +Channel  = Expression . +</pre> + +<p> +Both the channel and the value expression are evaluated before communication +begins. Communication blocks until the send can proceed, at which point the +value is transmitted on the channel. +A send on an unbuffered channel can proceed if a receiver is ready. +A send on a buffered channel can proceed if there is room in the buffer. +</p> + +<pre> +ch <- 3 +</pre> + +<p> +Sending to a <code>nil</code> channel causes a +<a href="#Run_time_panics">run-time panic</a>. +</p> + +  <h3 id="IncDec_statements">IncDec statements</h3>  <p> @@ -3680,8 +3663,8 @@ In assignments, each value must be  <a href="#Assignability">assignable</a> to the type of the  operand to which it is assigned. If an untyped <a href="#Constants">constant</a>  is assigned to a variable of interface type, the constant is <a href="#Conversions">converted</a> -to type <code>bool</code>, <code>int</code>, <code>float</code>, -<code>complex</code> or <code>string</code> +to type <code>bool</code>, <code>int</code>, <code>float64</code>, +<code>complex128</code> or <code>string</code>  respectively, depending on whether the value is a boolean, integer, floating-point,  complex, or string constant.  </p> @@ -3847,9 +3830,9 @@ case nil:  	printString("x is nil")  case int:  	printInt(i)  // i is an int -case float: -	printFloat(i)  // i is a float -case func(int) float: +case float64: +	printFloat64(i)  // i is a float64 +case func(int) float64:  	printFunction(i)  // i is a function  case bool, string:  	printString("type is bool or string")  // i is an interface{} @@ -3868,9 +3851,9 @@ if v == nil {  	printString("x is nil")  } else if i, is_int := v.(int); is_int {  	printInt(i)  // i is an int -} else if i, is_float := v.(float); is_float { -	printFloat(i)  // i is a float -} else if i, is_func := v.(func(int) float); is_func { +} else if i, is_float64 := v.(float64); is_float64 { +	printFloat64(i)  // i is a float64 +} else if i, is_func := v.(func(int) float64); is_func {  	printFunction(i)  // i is a function  } else {  	i1, is_bool := v.(bool) @@ -4093,15 +4076,19 @@ cases all referring to communication operations.  <pre class="ebnf">  SelectStmt = "select" "{" { CommClause } "}" .  CommClause = CommCase ":" { Statement ";" } . -CommCase = "case" ( SendExpr | RecvExpr) | "default" . -SendExpr =  Expression "<-" Expression . -RecvExpr =  [ Expression ( "=" | ":=" ) ] "<-" Expression . +CommCase   = "case" ( SendStmt | RecvStmt ) | "default" . +RecvStmt   = [ Expression ( "=" | ":=" ) ] RecvExpr . +RecvExpr   = Expression .  </pre> +<!-- TODO(rsc): +RecvStmt =  [ Expression [ "," Expression ] ( "=" | ":=" ) ] RecvExpr . +-->  <p> -For all the send and receive expressions in the "select" +RecvExpr must be a <a href="#Receive_operator">receive operation</a>. +For all the cases in the "select"  statement, the channel expressions are evaluated in top-to-bottom order, along with -any expressions that appear on the right hand side of send expressions. +any expressions that appear on the right hand side of send statements.  A channel may be <code>nil</code>,  which is equivalent to that case not  being present in the select statement @@ -4126,6 +4113,7 @@ in the "select" statement.  If multiple cases can proceed, a pseudo-random fair choice is made to decide  which single communication will execute.  <p> +<!-- TODO(rsc): s/variable/& or &s/ -->  The receive case may declare a new variable using a  <a href="#Short_variable_declarations">short variable declaration</a>.  </p> @@ -4138,6 +4126,14 @@ case i1 = <-c1:  	print("received ", i1, " from c1\n")  case c2 <- i2:  	print("sent ", i2, " to c2\n") +<!-- TODO(rsc): add , c3 to channel list above too +case i3, ok := <-c3: +	if ok { +		print("received ", i3, " from c3\n") +	} else { +		print("c3 is closed\n") +	} +-->  default:  	print("no communication\n")  } @@ -4189,7 +4185,7 @@ func simple_f() int {  	return 2  } -func complex_f1() (re float, im float) { +func complex_f1() (re float64, im float64) {  	return -7.0, -4.0  }  </pre> @@ -4201,7 +4197,7 @@ func complex_f1() (re float, im float) {  		"return" statement listing these variables, at which point the  		rules of the previous case apply.  <pre> -func complex_f2() (re float, im float) { +func complex_f2() (re float64, im float64) {  	return complex_f1()  }  </pre> @@ -4212,7 +4208,7 @@ func complex_f2() (re float, im float) {  		and the function may assign values to them as necessary.  		The "return" statement returns the values of these variables.  <pre> -func complex_f3() (re float, im float) { +func complex_f3() (re float64, im float64) {  	re = 7.0  	im = 4.0  	return @@ -4391,15 +4387,21 @@ BuiltinCall = identifier "(" [ BuiltinArgs [ "," ] ] ")" .  BuiltinArgs = Type [ "," ExpressionList ] | ExpressionList .  </pre> +<!-- TODO(rsc): s/.and.closed//g -->  <h3 id="Close_and_closed">Close and closed</h3>  <p>  For a channel <code>c</code>, the built-in function <code>close(c)</code>  marks the channel as unable to accept more values through a send operation; -values sent to a closed channel are ignored. +sending to or closing a closed channel causes a <a href="#Run_time_panics">run-time panic</a>.  After calling <code>close</code>, and after any previously  sent values have been received, receive operations will return  the zero value for the channel's type without blocking. + +<!-- TODO(rsc): delete next sentence, replace with +  The multi-valued <a href="#Receive_operator">receive operation</a> +  returns a received value along with an indication of whether the channel is closed. +-->  After at least one such zero value has been  received, <code>closed(c)</code> returns true.  </p> @@ -4474,7 +4476,7 @@ For instance  </p>  <pre> -type S struct { a int; b float } +type S struct { a int; b float64 }  new(S)  </pre> @@ -4593,29 +4595,28 @@ n3 := copy(b, "Hello, World!")  // n3 == 5, b == []byte("Hello")  <p>  Three functions assemble and disassemble complex numbers. -The built-in function <code>cmplx</code> constructs a complex +The built-in function <code>complex</code> constructs a complex  value from a floating-point real and imaginary part, while  <code>real</code> and <code>imag</code>  extract the real and imaginary parts of a complex value.  </p>  <pre class="grammar"> -cmplx(realPart, imaginaryPart floatT) complexT +complex(realPart, imaginaryPart floatT) complexT  real(complexT) floatT  imag(complexT) floatT  </pre>  <p>  The type of the arguments and return value correspond. -For <code>cmplx</code>, the two arguments must be of the same +For <code>complex</code>, the two arguments must be of the same  floating-point type and the return type is the complex type  with the corresponding floating-point constituents: -<code>complex</code> for <code>float</code>,  <code>complex64</code> for <code>float32</code>,  <code>complex128</code> for <code>float64</code>.  The <code>real</code> and <code>imag</code> functions  together form the inverse, so for a complex value <code>z</code>, -<code>z</code> <code>==</code> <code>cmplx(real(z),</code> <code>imag(z))</code>. +<code>z</code> <code>==</code> <code>complex(real(z),</code> <code>imag(z))</code>.  </p>  <p> @@ -4624,12 +4625,12 @@ value is a constant.  </p>  <pre> -var a = cmplx(2, -2)  // has type complex -var b = cmplx(1.0, -1.4)  // has type complex -x := float32(math.Cos(math.Pi/2)) -var c64 = cmplx(5, -x)  // has type complex64 -var im = imag(b)  // has type float -var rl = real(c64)  // type float32 +var a = complex(2, -2)             // complex128 +var b = complex(1.0, -1.4)         // complex128 +x := float32(math.Cos(math.Pi/2))  // float32 +var c64 = complex(5, -x)           // complex64 +var im = imag(b)                   // float64 +var rl = real(c64)                 // float32  </pre>  <h3 id="Handling_panics">Handling panics</h3> @@ -4984,7 +4985,7 @@ After  </p>  <pre> -type T struct { i int; f float; next *T } +type T struct { i int; f float64; next *T }  t := new(T)  </pre> | 
