code: func (abiSpec *AbiSpec) Pack(fname string, args ...interface{}) ([]byte, *FunctionSpec, error) {
  	var funcSpec FunctionSpec
  	var argSpec []Argument
  	if fname != "" {
  		if _, ok := abiSpec.Functions[fname]; ok {
  			funcSpec = abiSpec.Functions[fname]
  		} else {
  			funcSpec = abiSpec.Fallback
  		}
  	} else {
  		funcSpec = abiSpec.Constructor
  	}
  
  	argSpec = funcSpec.Inputs
  
  	if argSpec == nil {
  		if fname == "" {
  			return nil, nil, fmt.Errorf("Contract does not have a constructor")
  		}
  
  		return nil, nil, fmt.Errorf("Unknown function %s", fname)
  	}
  
  	packed := make([]byte, 0)
  
  	if fname != "" {
  		packed = funcSpec.FunctionID[:]
  	}
  
  	packedArgs, err := Pack(argSpec, args...)
  	if err != nil {
  		return nil, nil, err
  	}
  
  	return append(packed, packedArgs...), &funcSpec, nil
  }
docs: // Pack ABI encodes a function call. The fname specifies which function should called, if
  // it doesn't exist exist the fallback function will be called. If fname is the empty
  // string, the constructor is called. The arguments must be specified in args. The count
  // must match the function being called.
  // Returns the ABI encoded function call, whether the function is constant according
  // to the ABI (which means it does not modified contract state)